/*
*	Ivan Concua 12352
*	Roberto Andrino 12413
*	Algoritmos y estructuras de datos
*	CircularList.java
*	Implementacion de List. CircularList es una lista circular.
*	Es parte del ADT de List
*/

public class CircularList<E> extends AbstractList<E>
{
	protected Node<E> tail; 
	protected int count;

	public CircularList()
	// pre: constructs a new circular list
	{
	   tail = null;
	   count = 0;
	}

	private void addFirst(E value)
	// metodo unico de CircularList
	// pre: value no es null
	// post: agrega un elemento a la cabeza de la lista
	{
	   Node<E> temp = new Node<E>(value);
	   
	   if (tail == null) // primer valor agregado
	   {
		   tail = temp;
		   tail.setNext(tail);
	   } 
	   
	   else // el elemento existe en la lista 
	   {
		   temp.setNext(tail.next());
		   tail.setNext(temp);
	   }
	   
	   count++;
	}
	
	public void push(E value)
	// pre:
    // post: Se agrega un item a la cola de la lista
    // sera el primer item en salir por un pop si no hay otro push
	{
	   addFirst(value);
	   tail = tail.next();
	}
	
	public E pop()
	// pre: La lista no esta vacia
    // post: Se remueve y se regresa la cola de la lista
	{
	   Node<E> finger = tail;
	   
	   while (finger.next() != tail)
		   finger = finger.next();
		   
	   // finger now points to second-to-last value
	   Node<E> temp = tail;
	   
	   if (finger == tail)
		   tail = null;
		   
	   else 
	   {
		   finger.setNext(tail.next());
		   tail = finger;
	   }
	   
	   count--;
	   return temp.value();
	}
	
	public E peek()
	// pre: La lista no esta vacia
    // post: Se regresa el valor de la cola de la lista
	{
		Node<E> temp = tail;
		return temp.value();
	}
	
	public int size()
	// pre:
    // post: regresa la cantidad de elementos en la lista
	{
		return count;
	}
}